/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.edu.fatec.ads.classes;

import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.Transient;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

/**
 *
 * @author BRUNO
 */
@Entity
public class Livro extends AbstractTO {

    //Atributos
    private int codigo;
    private String isbn;
    private String titulo;
    private int edicao;
    private boolean emprestado;
    private Editora editora;
    private Idioma idioma;
    private List<Autor> autores;
    private List<Categoria> categorias;

    //Construtor Padrao
    public Livro() {
    }

    /**
     * @return the codigo
     */
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="cd_tombo", length=5)
    public int getCodigo() {
        return codigo;
    }

    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    //Metodos
    /**
     * @return the isbn
     */
    @Column(name="cd_isbn", length=13, nullable=false)
    public String getIsbn() {
        return isbn;
    }

    /**
     * @param isbn the isbn to set
     */
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    /**
     * @return the titulo
     */
    @Column(name="nm_titulo", length=100, nullable=false)
    public String getTitulo() {
        return titulo;
    }

    /**
     * @param titulo the titulo to set
     */
    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    /**
     * @return the edicao
     */
    @Column(name="cd_edicao", length=3, nullable=false)
    public int getEdicao() {
        return edicao;
    }

    /**
     * @param edicao the edicao to set
     */
    public void setEdicao(int edicao) {
        this.edicao = edicao;
    }

    /**
     * @return the statusEmprestado
     */
    @Column(name="ic_situacao", length=1, nullable=false)
    public boolean isEmprestado() {
        return emprestado;
    }

    /**
     * @param statusEmprestado the statusEmprestado to set
     */
    public void setEmprestado(boolean statusEmprestado) {
        this.emprestado = statusEmprestado;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @Fetch(FetchMode.SELECT)
    @JoinColumn(name="cd_editora", nullable=false)
    public Editora getEditora() {
        return editora;
    }
    
    public void setEditora(Editora editora) {
        this.editora = editora;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @Fetch(FetchMode.SELECT)
    @JoinColumn(name="cd_idioma", nullable=false)
    public Idioma getIdioma(){
        return idioma;
    }
    
    public void setIdioma(Idioma idioma){
        this.idioma = idioma;
    }

    /**
     * @return the autores
     */
    @ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name="LIVRO_AUTOR",
               joinColumns=@JoinColumn(name="cd_tombo", nullable=false),
               inverseJoinColumns=@JoinColumn(name="cd_autor", nullable=false))
    public List<Autor> getAutores() {
        return autores;
    }

    /**
     * @param autores the autores to set
     */
    public void setAutores(List<Autor> autores) {
        this.autores = autores;
    }

    /**
     * @return the categorias
     */
    @ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST, CascadeType.MERGE})
    @JoinTable(name="LIVRO_CATEGORIA",
               joinColumns=@JoinColumn(name="cd_tombo", nullable=false),
               inverseJoinColumns=@JoinColumn(name="cd_categoria", nullable=false))
    public List<Categoria> getCategorias() {
        return categorias;
    }

    /**
     * @param categorias the categorias to set
     */
    public void setCategorias(List<Categoria> categorias) {
        this.categorias = categorias;
    }

    @Override
    @Transient
    public Serializable getPK() {
        return this.getCodigo();
    }

    @Override
    public void setPK(Serializable identifier) {
        this.setCodigo((Integer) identifier);
    }

    @Override
    public String toString() {
        return "Livro[tombo=" +  this.getCodigo() +
                ", ISBN=" + this.getIsbn() + ", titulo=" + this.getTitulo()
                + ", edicao=" + this.getEdicao()
                + ", statusEmprestado=" + this.isEmprestado() + "]";
    }
}